package ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.tabla;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import ar.uba.fi.taller2.cmmiassistant.controlador.Controlador;
import ar.uba.fi.taller2.cmmiassistant.modelo.evaluacion.Instancia;
import ar.uba.fi.taller2.cmmiassistant.modelo.evidencias.Evidencia;
import ar.uba.fi.taller2.cmmiassistant.observador.Observable;
import ar.uba.fi.taller2.cmmiassistant.observador.Observador;
import ar.uba.fi.taller2.cmmiassistant.observador.ServicioNotificacion;

public class TableModelEvidencias extends TableModelBeanAdapter {

    private static final long serialVersionUID = -3705110358394627322L;

    private Controlador controlador;

    private List<Evidencia> evidencias = new ArrayList<Evidencia>();

    public TableModelEvidencias() {

        super(Evidencia.class, "idEvidencia", "tipo", "descripcion", "fuente",
                "link", "estado");
    }

    public int getRowCount() {
        return this.getEvidencias().size();
    }

    public Object getValueAt(int fila, int columna) {
        return this.getValueAt(this.getEvidencia(fila), columna);
    }

    public Evidencia getEvidencia(int fila) {
        
        return this.getEvidencias().get(fila);
    }
    
    protected List<Evidencia> getEvidencias() {
        return this.evidencias;
    }
    
    public Evidencia[] getEvidencias(List<Integer> filas) {
        
        List<Evidencia> seleccionadas = new ArrayList<Evidencia>();
        
        for (Integer fila : filas) {
            
            seleccionadas.add(this.getEvidencia(fila));
        }
        
        return seleccionadas.toArray(new Evidencia[seleccionadas.size()]);
    }
    
    protected void setEvidencias(Collection<Evidencia> evidencias) {

        this.evidencias.clear();
        this.evidencias.addAll(evidencias);
    }

    public void setControlador(Controlador controlador) {

        this.controlador = controlador;

        ServicioNotificacion.addObservador(this.getControlador().getModelo()
                .getInstanciaSeleccionada(), this.observadorModelo);
        
        this.cargar();
    }

    private void cargar() {

        Instancia instancia = this.getControlador().getModelo()
        .getInstanciaSeleccionada().getValor();

        if (instancia != null) {
            this.setEvidencias(instancia.getEvidencias());
        }
    }

    private Controlador getControlador() {
        return this.controlador;
    }
    

    private final Observador observadorModelo = new Observador() {

        public void cambio(Observable entidad) {

            TableModelEvidencias.this.cargar();
            TableModelEvidencias.this.fireTableDataChanged();
        }
    };
}
